package com.assembly.system.service.impl;

import com.assembly.entities.SystemUser;
import com.assembly.system.mapper.UserMapper;
import com.assembly.system.req.UserREQ;
import com.assembly.system.req.UserUpdatePasswordREQ;
import com.assembly.system.service.IUserService;
import com.assembly.util.base.Result;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Date;


/**
 * <p>
 * 平台用户信息表 服务实现类
 * </p>
 *
 * @author 丽人平台-www.assembly.com
 * @since 2021-03-29
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, SystemUser> implements IUserService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /***
     * 注册用户
     * @param user
     * @return
     */
    @Override
    public Result userRegister(SystemUser user) {
        //如果 用户名不为空或者
        if (checkAccount(user.getAccount(),user.getType())){
            return Result.error("用户名为空或用户名已存在");
        }

        if (StringUtils.isNotEmpty(user.getMobile())&&checkMobile(user.getMobile(),user.getType())){
            return Result.error("手机号已存在");
        }

        if (StringUtils.isNotEmpty(user.getIdentity())&&checkMobile(user.getIdentity(),user.getType())){
            return Result.error("身份证已存在");
        }
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        baseMapper.insert(user);
        return Result.ok();
    }

    /***
     * 查询用户列表
     * @param userREQ
     * @return
     */
    @Override
    public IPage<SystemUser> findListByUser(UserREQ userREQ) {
        QueryWrapper<SystemUser> queryWrapper = getQueryWrapper(userREQ);
        IPage<SystemUser> userIPage = baseMapper.selectPage(userREQ.getPage(), queryWrapper);
        return userIPage;
    }

    /***
     * 通过ID 查询
     * @param id 用户ID
     * @return
     */
    @Override
    public SystemUser findUserById(String id) {
        return baseMapper.selectById(id);
    }

    /***
     * 通过账号查询
     * @param account  用户账号
     * @return
     */
    @Override
    public SystemUser findUserByAccount(String account,int type) {
        QueryWrapper<SystemUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account",account);
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_account_non_expired",1);
        queryWrapper.eq("is_enabled",1);
        return baseMapper.selectOne(queryWrapper);
    }

    @Override
    public SystemUser findUserByMobile(String mobile,int type) {
        QueryWrapper<SystemUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("mobile",mobile);
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_account_non_expired",1);
        queryWrapper.eq("is_enabled",1);
        return baseMapper.selectOne(queryWrapper);
    }

    /**
     * 通过微信openId查询
     * @param wxOpenId
     * @return
     */
    @Override
    public SystemUser findUserByWxOpenId(String wxOpenId,int type) {
        QueryWrapper<SystemUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("wechat_open_id",wxOpenId);
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_account_non_expired",1);
        queryWrapper.eq("is_enabled",1);
        return baseMapper.selectOne(queryWrapper);
    }

    /***
     * 通过支付宝 唯一标识查询
     * @param alipayOpenId
     * @return
     */
    @Override
    public SystemUser findUserByAlipayOpenId(String alipayOpenId,int type) {
        QueryWrapper<SystemUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("alipay_open_id",alipayOpenId);
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_account_non_expired",1);
        queryWrapper.eq("is_enabled",1);
        return baseMapper.selectOne(queryWrapper);
    }

    /**
     * 通过QQ唯一标识查询
     * @param qqOpenId
     * @return
     */
    @Override
    public SystemUser findUserByQQOpenId(String qqOpenId,int type) {
        QueryWrapper<SystemUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("qq_openid",qqOpenId);
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_account_non_expired",1);
        queryWrapper.eq("is_enabled",1);
        return baseMapper.selectOne(queryWrapper);
    }

    /***
     * 登陆后修改密码
     * @param userUpdatePasswordREQ
     * @return
     */
    @Override
    public Result updatePassWord(UserUpdatePasswordREQ userUpdatePasswordREQ) {
        if (userUpdatePasswordREQ.getNewPassword().equals(userUpdatePasswordREQ.getRepPassword())){
            SystemUser user = baseMapper.selectById(userUpdatePasswordREQ.getUserId());
            user.setPassword(passwordEncoder.encode(userUpdatePasswordREQ.getNewPassword()));
            user.setPwdUpdateDate(new Date());
            baseMapper.updateById(user);
            return  Result.ok();
        }else {
            return Result.error("两次密码输入不一致！");
        }
    }

    /**
     * 校验账号是否存在
     * @param account 账号
     * @param type 类型 （1平台账号，2B端账号 3 C端账号）
     * @return
     */
    @Override
    public boolean checkAccount(String account,int type){
        if (StringUtils.isNotEmpty(account)){
            QueryWrapper<SystemUser> wrapper =  new QueryWrapper<>();
            wrapper.eq("account" ,account);
            wrapper.eq("type" ,type);
            return  baseMapper.selectCount(wrapper)<=0;
        }else{
            return  false;
        }
    }

    /**
     * 校验手机是否存在
     * @param mobile  手机号
     * @param type 类型 （1平台账号，2B端账号 3 C端账号）
     * @return
     */
    @Override
    public boolean checkMobile(String mobile,int type){
        QueryWrapper<SystemUser> wrapper =  new QueryWrapper<>();
        wrapper.eq("mobile" ,mobile);
        wrapper.eq("type" ,type);
        return  baseMapper.selectCount(wrapper)>0;
    }

    /***
     *
     * 校验身份证号是否存在
     * @param identity 身份证号
     * @param type 类型 （1平台账号，2B端账号 3 C端账号）
     * @return
     */
    @Override
    public boolean checkIdentity(String identity,int type){
        QueryWrapper<SystemUser> wrapper =  new QueryWrapper<>();
        wrapper.eq("identity" ,identity);
        wrapper.eq("type" ,type);
        return  baseMapper.selectCount(wrapper)>0;
    }


    /**
     * 封装 用户列表查询条件
     * @param userREQ
     * @return
     */
    private QueryWrapper<SystemUser> getQueryWrapper(UserREQ userREQ){

        QueryWrapper<SystemUser> wrapper =new QueryWrapper<>();
        //姓名
        if(StringUtils.isNotEmpty(userREQ.getUsername())){
            wrapper.eq("username",userREQ.getUsername());
        }
        //性别
        if( userREQ.getSex()!=null||userREQ.getSex()>0){
            wrapper.eq("sex",userREQ.getSex());
        }
        //身份号
        if(StringUtils.isNotEmpty(userREQ.getIdentity())){
            wrapper.eq("identity",userREQ.getIdentity());
        }
        //省
        if(StringUtils.isNotEmpty(userREQ.getProvince())){
            wrapper.eq("province",userREQ.getProvince());
        }
        //市
        if(StringUtils.isNotEmpty(userREQ.getCity())){
            wrapper.eq("province",userREQ.getCity());
        }
        // 区(所在地）
        if(StringUtils.isNotEmpty(userREQ.getArea())){
            wrapper.eq("area",userREQ.getArea());
        }
        //  邮箱
        if(StringUtils.isNotEmpty(userREQ.getEmail())){
            wrapper.eq("email",userREQ.getEmail());
        }
        //账号
        if(StringUtils.isNotEmpty(userREQ.getAccount())){
            wrapper.eq("email",userREQ.getAccount());
        }
        //手机号
        if(StringUtils.isNotEmpty(userREQ.getMobile())){
            wrapper.eq("email",userREQ.getMobile());
        }
//        @ApiModelProperty(value = "1、平台用户 2、B端用户、C端用户")
//        private Integer type;
        if(userREQ.getType()!=null&&userREQ.getType()>0){
            wrapper.eq("type",userREQ.getType());
        }
//        @ApiModelProperty(value = "帐户是否过期(1 未过期，0已过期)")
//        private Integer isAccountNonExpired;
        if(userREQ.getIsAccountNonExpired()!=null&&userREQ.getIsAccountNonExpired()>0){
            wrapper.eq("is_account_non_expired",userREQ.getType());
        }
//        @ApiModelProperty(value = "帐户是否被锁定(1未锁定，0已锁定)")
//        private Integer isAccountNonLocked;
        if(userREQ.getIsAccountNonLocked()!=null&&userREQ.getIsAccountNonLocked()>0){
            wrapper.eq("is_account_nonLocked",userREQ.getIsAccountNonLocked());
        }
//        @ApiModelProperty(value = "密码是否过期(1 未过期，0已过期)")
//        private Integer isCredentialsNonExpired;
        if(userREQ.getIsCredentialsNonExpired()!=null&&userREQ.getIsCredentialsNonExpired()>0){
            wrapper.eq("is_credentials_non_expired",userREQ.getIsCredentialsNonExpired());
        }
//        @ApiModelProperty(value = "帐户是否可用(1 可用，0 删除用户)")
//        private Integer isEnabled;
        if(userREQ.getIsEnabled()!=null&&userREQ.getIsEnabled()>0){
            wrapper.eq("is_enabled",userREQ.getIsEnabled());
        }

        return  wrapper;
    }




//    @Override
//    public Result findUserMenuTree(String userId) {
//        // 1. 通过用户id查询所有的权限(目录/菜单/按钮)
//        List<Resources> menuList = baseMapper.findByUserId(userId);
//        // 当userId不存在用户信息, menuList 空的, 如果存在用户但没有分配权限就会有一条空记录
//        if(CollectionUtils.isEmpty(menuList)
//                || menuList.get(0) == null
//        ) {
//            return Result.build(ResultEnum.MENU_NO);
//        }
//
//        // 2. 获取集合中的目录和菜单放到一个集合中,按钮放到一个集合中
//        // 存放目录和菜单集合的
//        List<SysMenu> dirMenuList = new ArrayList<>();
//        // 存放按钮集合的,只要权限标识code值
//        List<String> buttonList = new ArrayList<>();
//        for(SysMenu menu: menuList) {
//            if(menu.getType().equals(1) || menu.getType().equals(2)) {
//                dirMenuList.add(menu); // 目录和菜单
//            }else {
//                buttonList.add(menu.getCode()); // 按钮
//            }
//        }
//
//        // 3. 封装树状菜单
//        List<SysMenu> menuTreeList = this.buildTree(dirMenuList);
//        // 4. 响应数据
//        Map<String, Object> data = new HashMap<>();
//        data.put("menuTreeList", menuTreeList);
//        data.put("buttonList", buttonList);
//        return Result.ok(data);
//    }

}
